from langchain_openai import ChatOpenAI
from langchain.prompts import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain.output_parsers import ResponseSchema, StructuredOutputParser

class KnowledgeAnalyzer:
    def __init__(self, api_key, api_base, model_name="deepseek-chat"):
        self.llm = ChatOpenAI(
            temperature=0.95,
            model=model_name,
            openai_api_key=api_key,
            openai_api_base=api_base
        )
        
        # 定义输出格式模式
        self.response_schemas = [
            ResponseSchema(name="title", description="知识卡片的标题"),
            ResponseSchema(name="summary", description="知识卡片的简要总结"),
            ResponseSchema(name="html_content", description="完整的HTML知识卡片代码"),
        ]
        self.output_parser = StructuredOutputParser.from_response_schemas(self.response_schemas)
        self.set_prompt()
    
    def _get_range_description(self):
        """获取当前难度级别的范围描述"""
        diff = self.DIFFICULTY_LEVELS[self.difficulty]
        return f"{diff['min']}-{diff['max']}"

    def set_difficulty(self, difficulty="normal"):
        """设置难度级别"""
        if difficulty not in self.DIFFICULTY_LEVELS:
            raise ValueError(f"不支持的难度级别: {difficulty}。可选值: {list(self.DIFFICULTY_LEVELS.keys())}")
        self.difficulty = difficulty
        # 更新提示模板和输出格式
        self.set_prompt()
    
    def set_prompt(self):
        # 设置系统提示
        self.system_template = """你是一个专业的知识卡片生成器，请根据提供的主题或内容，创建美观、结构清晰的HTML知识卡片。

### 知识卡片要求：
1. **格式**：以HTML格式输出，确保代码可以直接复制使用
2. **设计风格**：
- 现代简约设计
- 响应式布局，适配不同设备
- 合理使用色彩对比增强可读性
- 包含适当的留白和间距
3. **卡片结构**：
- 醒目的标题区域
- 核心概念简明概述
- 要点或关键信息列表
- 相关例子或应用场景（如适用）
- 可选的视觉元素（如图标、分隔线等）

4. **内容特点**：
- 信息精炼，避免冗长
- 使用简洁明了的语言
- 按逻辑顺序组织内容
- 重点内容有视觉强调

请按照以下格式返回JSON：
{{
    "title": "知识卡片的标题",
    "summary": "知识卡片的简要总结（100字以内）",
    "html_content": "完整的HTML代码（包含内联CSS样式）"
}}"""
        
        self.prompt = ChatPromptTemplate(
            messages=[
                SystemMessagePromptTemplate.from_template(
                    self.system_template,
                    partial_variables={
                        "format_instructions": self.output_parser.get_format_instructions()
                    }
                ),
                HumanMessagePromptTemplate.from_template("{question}")
            ]
        )
        
        self.conversation = self.prompt | self.llm

    def analyze_text(self, text):
        """分析文本内容并生成知识卡片"""
        try:
            response = self.conversation.invoke({"question": f"请根据以下内容生成知识卡片：{text}"})
            result = self.output_parser.parse(response.content)
            return {
                'title': result['title'],
                'summary': result['summary'],
                'html_content': result['html_content']
            }
        except Exception as e:
            print(e)
            return {
                'title': '',
                'summary': '',
                'html_content': ''
            }
    
    def analyze_file(self, file_path):
        """分析文件内容并生成知识卡片"""
        with open(file_path, 'r', encoding='utf-8') as f:
            content = f.read()
        return self.analyze_text(content)

# 使用示例
if __name__ == "__main__":
    API_KEY="sk-b92412aea51b46d19c0ddc3c743c9fb9"
    API_BASE="https://api.deepseek.com/v1" 
    
    # 创建分析器实例
    analyzer = KnowledgeAnalyzer(API_KEY, API_BASE,model_name="deepseek-chat")
    
    # 测试生成知识卡片
    result = analyzer.analyze_file("E:\\APP\\QuickLearn\\server\\static\\docs\\test.txt")
    print("\n生成的知识卡片：")
    print(f"标题：{result['title']}")
    print(f"摘要：{result['summary']}")
    print("\nHTML内容：")
    print(result['html_content'])
